Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


RNS/Cryptography/Token.py 72db6e0ef2e9da96b5f164eb7c37ddbf3022bdec (72db6e0e) Text, 4.48 KB

T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72import T7ee787os
Tff7b72import T7ee787time

Tff7b72from T7ee787RNST7ee787.T7ee787Cryptography Tff7b72import Te6edf3HMAC
Tff7b72from T7ee787RNST7ee787.T7ee787Cryptography Tff7b72import Te6edf3PKCS7
Tff7b72from T7ee787RNST7ee787.T7ee787Cryptography Tff7b72import Te6edf3AES
Tff7b72from T7ee787RNST7ee787.T7ee787CryptographyT7ee787.T7ee787AES Tff7b72import Te6edf3AES_128_CBC
Tff7b72from T7ee787RNST7ee787.T7ee787CryptographyT7ee787.T7ee787AES Tff7b72import Te6edf3AES_256_CBC

Tff7b72class T56d364TokenTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
This class provides a slightly modified implementation of the Fernet spec
found at: https://github.com/fernet/spec/blob/master/Spec.md

According to the spec, a Fernet token includes a one byte VERSION and
eight byte TIMESTAMP field at the start of each token. These fields are
not relevant to Reticulum. They are therefore stripped from this
implementation, since they incur overhead and leak initiator metadata.
"""
Te6edf3TOKEN_OVERHEAD Tff7b72= T79c0ff48 T8b949e# Bytes

Tf0883e@staticmethod
Tff7b72def Td2a8ffgenerate_keyTb4b4b4(Te6edf3modeTff7b72=Te6edf3AES_256_CBCTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3mode Tff7b72== Te6edf3AES_128_CBCTb4b4b4: Tff7b72return Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff32Tb4b4b4)
Tff7b72elif Te6edf3mode Tff7b72== Te6edf3AES_256_CBCTb4b4b4: Tff7b72return Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff64Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid token mode: Tffd700{Te6edf3modeTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTff7b72=Tff7b72NoneTb4b4b4, Te6edf3modeTff7b72=Te6edf3AESTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3key Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffToken key cannot be NoneTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3mode Tff7b72== Te6edf3AESTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3keyTb4b4b4) Tff7b72== T79c0ff32Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3AES_128_CBC
Tff7b72selfTff7b72.Td2a8ff_signing_key Tff7b72= Te6edf3keyTb4b4b4[Tb4b4b4:T79c0ff16Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_encryption_key Tff7b72= Te6edf3keyTb4b4b4[T79c0ff16Tb4b4b4:Tb4b4b4]

Tff7b72elif Tffa657lenTb4b4b4(Te6edf3keyTb4b4b4) Tff7b72== T79c0ff64Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3AES_256_CBC
Tff7b72selfTff7b72.Td2a8ff_signing_key Tff7b72= Te6edf3keyTb4b4b4[Tb4b4b4:T79c0ff32Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_encryption_key Tff7b72= Te6edf3keyTb4b4b4[T79c0ff32Tb4b4b4:Tb4b4b4]

Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffToken key must be 128 or 256 bits, not Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3keyTb4b4b4)Tff7b72*T79c0ff8Tb4b4b4)Tb4b4b4)

Tff7b72elseTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid token mode: Tffd700{Te6edf3modeTffd700}Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffverify_hmacTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tokenTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tokenTb4b4b4) Tff7b72<Tff7b72= T79c0ff32Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot verify HMAC on token of only Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3tokenTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3received_hmac Tff7b72= Te6edf3tokenTb4b4b4[Tff7b72-T79c0ff32Tb4b4b4:Tb4b4b4]
Te6edf3expected_hmac Tff7b72= Te6edf3HMACTff7b72.Td2a8ffnewTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_signing_keyTb4b4b4, Te6edf3tokenTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff32Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3received_hmac Tff7b72== Te6edf3expected_hmacTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False


Tff7b72def Td2a8ffencryptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3data Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffToken plaintext input must be bytesTa5d6ff"Tb4b4b4)
Te6edf3iv Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)

Te6edf3ciphertext Tff7b72= Tff7b72selfTff7b72.Td2a8ffmodeTff7b72.Td2a8ffencryptTb4b4b4(
Te6edf3plaintext Tff7b72= Te6edf3PKCS7Tff7b72.Td2a8ffpadTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4,
Te6edf3key Tff7b72= Tff7b72selfTff7b72.Td2a8ff_encryption_keyTb4b4b4,
Te6edf3iv Tff7b72= Te6edf3ivTb4b4b4)

Te6edf3signed_parts Tff7b72= Te6edf3ivTff7b72+Te6edf3ciphertext
Tff7b72return Te6edf3signed_parts Tff7b72+ Te6edf3HMACTff7b72.Td2a8ffnewTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_signing_keyTb4b4b4, Te6edf3signed_partsTb4b4b4)Tff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffdecryptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3token Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3tokenTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffToken must be bytesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffverify_hmacTb4b4b4(Te6edf3tokenTb4b4b4)Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffToken HMAC was invalidTa5d6ff"Tb4b4b4)

Te6edf3iv Tff7b72= Te6edf3tokenTb4b4b4[Tb4b4b4:T79c0ff16Tb4b4b4]
Te6edf3ciphertext Tff7b72= Te6edf3tokenTb4b4b4[T79c0ff16Tb4b4b4:Tff7b72-T79c0ff32Tb4b4b4]

Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3PKCS7Tff7b72.Td2a8ffunpadTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffmodeTff7b72.Td2a8ffdecryptTb4b4b4(
Te6edf3ciphertext Tff7b72= Te6edf3ciphertextTb4b4b4,
Te6edf3key Tff7b72= Tff7b72selfTff7b72.Td2a8ff_encryption_keyTb4b4b4,
Te6edf3iv Tff7b72= Te6edf3ivTb4b4b4)Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not decrypt token: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────